#!/bin/bash

# 初始化为空，必须通过参数传递，下面三个参数是保留参数，不能自定义参数中包含保留参数的变量名，并且必须全部设置。
APP_NAME=""
APP_VERSION=""
JAVA_OPTS=""

# 遍历所有参数 KEY=VALUE，赋值变量
for arg in "$@"
do
  case $arg in
    APP_NAME=*)
      APP_NAME="${arg#*=}"
      ;;
    APP_VERSION=*)
      APP_VERSION="${arg#*=}"
      ;;
    JAVA_OPTS=*)
      JAVA_OPTS="${arg#*=}"
      ;;
    *)
      echo "非保留参数: $arg" # 打印非保留参数，且在docker build时,会进行传递。
      ;;
  esac
done

# 校验必传参数
if [[ -z "$APP_NAME" ]]; then
  echo "错误：必须传入 APP_NAME 参数"
  exit 1
fi

if [[ -z "$APP_VERSION" ]]; then
  echo "错误：必须传入 APP_VERSION 参数"
  exit 2
fi

# 设置默认 JAVA_OPTS（如果未设置）
if [[ -z "$JAVA_OPTS" ]]; then
  JAVA_OPTS="-Xms512m -Xmx512m"
fi

CONTAINER_NAME="${APP_VERSION}_$(date +%Y%m%d%H%M%S)"
IMAGE_TAG="${APP_NAME}:${APP_VERSION}"
APP_LOG_ROOT_PATH="/app/logs/${CONTAINER_NAME}/"

echo "======================================="
echo "运行容器参数："
echo "APP_NAME          = ${APP_NAME}"
echo "APP_VERSION       = ${APP_VERSION}"
echo "JAVA_OPTS         = ${JAVA_OPTS}"
echo "CONTAINER_NAME    = ${CONTAINER_NAME}"
echo "IMAGE_TAG         = ${IMAGE_TAG}"
echo "APP_LOG_ROOT_PATH = ${APP_LOG_ROOT_PATH}"

echo "======================================="

# 检查容器是否已存在并删除（模糊匹配同一 APP_NAME + APP_VERSION 的旧容器）
OLD_CONTAINERS=$(docker ps -a --format '{{.Names}}' | grep "^${APP_NAME}@${APP_VERSION}@" || true)
if [[ -n "$OLD_CONTAINERS" ]]; then
  echo "发现旧容器："
  echo "$OLD_CONTAINERS"

  IFS=$'\n'  # 防止容器名中出现空格或特殊字符造成 for 循环出错
  for name in $OLD_CONTAINERS; do
    echo "删除旧容器：$name"
    docker rm -f "$name"
  done
  unset IFS
fi

# 运行容器
docker run -d \
  --rm \
  --name "${CONTAINER_NAME}" \
  -e "JAVA_OPTS=${JAVA_OPTS}" \
  -e "APP_LOG_ROOT_PATH=${APP_LOG_ROOT_PATH}" \
  -p 8080:8081 \
  -v "${APP_NAME}:/app/logs/" \
  "${IMAGE_TAG}"

# 检查容器是否成功启动
echo "检查容器状态..."
sleep 2

if docker ps -q -f name="${CONTAINER_NAME}" | grep -q .; then
  echo "容器 ${CONTAINER_NAME} 已成功启动!"
  docker ps -f name="${CONTAINER_NAME}"
else
  echo "错误：容器 ${CONTAINER_NAME} 未能启动!"
  echo "查看容器日志以获取更多信息:"
  echo "docker logs ${CONTAINER_NAME}"
  exit 3
fi

